/**
 在 TypeScript 中，条件类型的类型推断主要是通过 `infer` 关键字来实现的。使用 `infer`，你可以在条件类型中引入一个类型变量，并根据输入类型推断出相应的类型。

### 条件类型的类型推断示例

下面是一个使用条件类型和 `infer` 关键字的示例，演示如何推断函数的返回类型：

```typescript
// 定义一个 ReturnType 类型，用于推断函数的返回类型
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

// 示例函数
type Func = (x: number) => string;

// 使用 ReturnType 推断 Func 的返回类型
type ResultType = ReturnType<Func>;  // ResultType 被推断为 string
```

在这个示例中：
- `ReturnType<T>` 是一个条件类型，它检查 `T` 是否是一个函数类型。如果是，则使用 `infer R` 推断该函数的返回类型 `R`；否则返回 `never`。
- 当我们将 `Func` 传递给 `ReturnType` 时，`R` 被推断为 `string`，因此 `ResultType` 的类型为 `string`。

### 更复杂的推断示例

你还可以使用条件类型和类型推断来处理更复杂的类型。例如，推断一个数组的元素类型：

```typescript
// 定义一个 ElementType 类型，用于推断数组的元素类型
type ElementType<T> = T extends (infer E)[] ? E : never;

// 示例数组类型
type NumberArray = number[];

// 使用 ElementType 推断 NumberArray 的元素类型
type NumType = ElementType<NumberArray>;  // NumType 被推断为 number
```

在这个示例中：
- `ElementType<T>` 检查 `T` 是否是一个数组类型。如果是，则使用 `infer E` 推断数组的元素类型 `E`；否则返回 `never`。
- 当我们将 `NumberArray` 传递给 `ElementType` 时，`E` 被推断为 `number`，因此 `NumType` 的类型为 `number`。

### 总结

- 使用 `infer` 关键字可以在条件类型中推断出类型。
- 通过条件类型和类型推断，可以创建灵活的类型工具，以便在类型系统中进行更复杂的操作。
 */
type CalcFnType = (num1: number, num2: string) => number;

function foo() {
  return 123;
}

// 总结类型体操题目: MyReturnType
// infer: 声明一个类型变量
type MyReturnType<T extends (...args: any[]) => any> = T extends (
  ...args: any[]
) => infer R
  ? R
  : never;

type MyParameterType<T extends (...args: any[]) => any> = T extends (
  ...args: infer A
) => any
  ? A
  : never;

// 获取一个函数的返回值类型: 内置工具
type CalcReturnType = MyReturnType<CalcFnType>;
type FooReturnType = MyReturnType<typeof foo>;
// type FooReturnType2 = MyReturnType<boolean>
type CalcParameterType = MyParameterType<CalcFnType>;

export {};
